package com.nova.edc.service.system.impl;

import java.util.List;

import com.nova.edc.dao.system.*;
import com.nova.edc.model.system.CollectAreaItemAir;
import com.nova.edc.service.system.CollectAreaItemAirService;
import com.nova.edc.service.system.DeviceAirService;
import org.springframework.beans.factory.annotation.Autowired;

import com.nova.edc.model.system.CollectArea;
import com.nova.edc.model.system.CollectAreaItem;
import com.nova.edc.model.system.ModelConstant;
import com.nova.edc.service.system.CollectAreaService;
import com.nova.frame.dao.buzz.query.Order;
import com.nova.frame.dao.buzz.query.Query;
import com.nova.frame.dao.criterion.Restrictions;
import com.nova.frame.dao.pager.Page;
import com.nova.frame.dao.pager.PageList;
import com.nova.frame.dao.parsing.SQLParser;
import com.nova.frame.utils.JdbcUtils;
import com.nova.frame.utils.StringUtils;
import com.nova.module.filter.query.Filter;
import com.nova.module.sql.SqlBuffer;

public class CollectAreaServiceImpl implements CollectAreaService {

    @Autowired
    private CollectAreaDao novaCollectAreaDao;
    @Autowired
    private CollectAreaItemDao novaCollectAreaItemDao;
    @Autowired
    private DeviceLightDao novaDeviceLightDao;
    @Autowired
    private DeviceAirService deviceAirService;
    @Autowired
    private CollectAreaItemAirService collectAreaItemAirService;
    @Autowired
    private CollectAreaItemAirDao collectAreaItemAirDao;

    @Override
    public PageList<CollectArea> findPageCollectArea(CollectArea collectArea,
                                                     Page page, String sidx, String sord) {
        Query<CollectArea> query = novaCollectAreaDao.query();
        query.addOrder(Order.custom(sord, sidx));
        Filter.addFilterCondition(query, collectArea);
        return query.pageList(page);
    }

    @Override
    public CollectArea getById(int id) {
        return novaCollectAreaDao.getById(String.valueOf(id));
    }

    @Override
    public CollectArea insert(CollectArea collectArea,
                              List<CollectAreaItem> collectAreaItems) {
        collectArea = novaCollectAreaDao.insert(collectArea);
        for (int i = 0; i < collectAreaItems.size(); i++) {
            CollectAreaItem collectAreaItem = collectAreaItems.get(i);
            collectAreaItem.setCompanycode(collectArea.getCompanycode());
            collectAreaItem.setCustomerinfoid(collectArea.getCustomerinfoid());
            collectAreaItem.setTralightid(novaDeviceLightDao.getLightByCode(
                    collectAreaItem.getTralightCode(),
                    ModelConstant.TRA_LIGHTTYPE).getId());
            collectAreaItem.setLedlightid(novaDeviceLightDao.getLightByCode(
                    collectAreaItem.getLedlightCode(),
                    ModelConstant.LED_LIGHTTYPE).getId());
            collectAreaItem.setHeadid(collectArea.getId());
            novaCollectAreaItemDao.insert(collectAreaItem);
        }
        return collectArea;
    }

    @Override
    public int update(CollectArea collectArea,
                      List<CollectAreaItem> collectAreaItems) {
        int flag = novaCollectAreaDao.updateNotNull(collectArea);
        for (int i = 0; i < collectAreaItems.size(); i++) {
            CollectAreaItem collectAreaItem = collectAreaItems.get(i);
            collectAreaItem.setTralightid(novaDeviceLightDao.getLightByCode(
                    collectAreaItem.getTralightCode(),
                    ModelConstant.TRA_LIGHTTYPE).getId());
            collectAreaItem.setLedlightid(novaDeviceLightDao.getLightByCode(
                    collectAreaItem.getLedlightCode(),
                    ModelConstant.LED_LIGHTTYPE).getId());
            if (collectAreaItem.getId() != null && collectAreaItem.getId() != 0) {
                novaCollectAreaItemDao.updateNotNull(collectAreaItem);
            } else {
                collectAreaItem.setHeadid(collectArea.getId());
                collectAreaItem.setCompanycode(collectArea.getCompanycode());
                collectAreaItem.setCustomerinfoid(collectArea.getCustomerinfoid());
                novaCollectAreaItemDao.insert(collectAreaItem);
            }
        }
        return flag;
    }

    @Override
    public int delete(int id) {
        novaCollectAreaItemDao.delete(Restrictions.eq("HeadId", id));
        collectAreaItemAirDao.delete(Restrictions.eq("HeadId", id));
        return novaCollectAreaDao.deleteById(String.valueOf(id));
    }

    @Override
    public List<String> getAllGateWay() {
        String sql = "SELECT DISTINCT (GatewayID) FROM t_collectarea where Scrapped=0";
        List<String> result = JdbcUtils.query(String.class, sql);
        return result;
    }

    @Override
    public Integer getCompanyCode(CollectArea collectArea) {
        CollectArea area = novaCollectAreaDao.query(collectArea).get();
        return area == null ? 0 : area.getCompanycode();
    }

    @Override
    public void trimCollectArea(CollectArea collectArea) {
        if (StringUtils.isNotNullOrEmpty(collectArea.getGatewayid())) {
            collectArea.setGatewayid(collectArea.getGatewayid().trim());
        }
    }

    @Override
    public List<CollectArea> findPageCollectAreaStatus(CollectArea collectArea,
                                                       String summaryDate, Page page, String sidx, String sord) {
        SqlBuffer sqlBuffer = new SqlBuffer(
                SQLParser.sql("collectAreaSQL.findPageCollectAreaStatus"),
                false);
        sqlBuffer.appendAnd("t_collectarea.CompanyCode",
                collectArea.getCompanycode());
        if (StringUtils.isNotNullOrEmpty(collectArea.getGatewayid())) {
            sqlBuffer.appendAnd("t_collectarea.GatewayID",
                    collectArea.getGatewayid());
        }
        if (collectArea.getSensorid() != null && collectArea.getSensorid() != 0) {
            sqlBuffer.appendAnd("t_collectarea.SensorID",
                    collectArea.getSensorid());
        }
        if (collectArea.getDevicetype() != null) {
            sqlBuffer.appendAnd("t_collectarea.Devicetype",
                    collectArea.getDevicetype());
        }
        sqlBuffer.appendOrder(sidx, sord);
        int rowCount = JdbcUtils.count(sqlBuffer.getCountSql(),
                collectArea.getCompanycode(), summaryDate).intValue();
        List<CollectArea> collectAreas = JdbcUtils.query_limit(
                CollectArea.class, sqlBuffer.getSelectSql(), page,
                collectArea.getCompanycode(), summaryDate);
        page.make(rowCount);
        return collectAreas;
    }

    @Override
    public CollectArea insertAir(CollectArea collectArea,
                                 List<CollectAreaItemAir> collectAreaItemAirs) {
        collectArea = novaCollectAreaDao.insert(collectArea);
        for (int i = 0; i < collectAreaItemAirs.size(); i++) {
            CollectAreaItemAir collectAreaItemAir = collectAreaItemAirs.get(i);
            collectAreaItemAir.setCompanycode(collectArea.getCompanycode());
            collectAreaItemAir.setCustomerinfoid(collectArea.getCustomerinfoid());
            collectAreaItemAir.setAirid(deviceAirService.getByCode(
                    collectAreaItemAir.getAirCode()).getId());
            collectAreaItemAir.setHeadid(collectArea.getId());
            collectAreaItemAirService.insert(collectAreaItemAir);
        }
        return collectArea;
    }

    @Override
    public int updateAir(CollectArea collectArea,
                         List<CollectAreaItemAir> collectAreaItemAirs) {
        int flag = novaCollectAreaDao.updateNotNull(collectArea);
        for (int i = 0; i < collectAreaItemAirs.size(); i++) {
            CollectAreaItemAir collectAreaItemAir = collectAreaItemAirs.get(i);
            collectAreaItemAir.setAirid(deviceAirService.getByCode(
                    collectAreaItemAir.getAirCode()).getId());
            if (collectAreaItemAir.getId() != null
                    && collectAreaItemAir.getId() != 0) {
                collectAreaItemAirService.updateNotNull(collectAreaItemAir);
            } else {
                collectAreaItemAir.setHeadid(collectArea.getId());
                collectAreaItemAir.setCompanycode(collectArea.getCompanycode());
                collectAreaItemAir.setCustomerinfoid(collectArea.getCustomerinfoid());
                collectAreaItemAirService.insert(collectAreaItemAir);
            }
        }
        return flag;
    }
}
